package insignia;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;

import java.util.ArrayList;
import java.util.List;

import junit.framework.Assert;
import model.Usuario.UsuarioSimple;
import model.insigniaYlogros.InsigniaCompuesta;
import model.insigniaYlogros.InsigniaSimple;
import model.insigniaYlogros.Logro;
import model.insigniaYlogros.LogroUsDeCantidadDeRespuestas;
import model.insigniaYlogros.LogroUsDeCantidadDeVotos;

import org.junit.Before;
import org.junit.Test;

public class TestInsigniaCompuesta {
	
	UsuarioSimple us;
	InsigniaCompuesta ic;
	InsigniaSimple iucr;
	InsigniaSimple iucv;
	
	Logro l;
    Logro l2;
   

	@Before
	public void setUp() throws Exception {
		l=mock(LogroUsDeCantidadDeRespuestas.class);//new LogroUsDeCantidadDeRespuestas(1);
		l2=mock(LogroUsDeCantidadDeVotos.class);//new LogroUsDeCantidadDeVotos(1);
		
		iucr=new InsigniaSimple("qw", l);
		iucv=new InsigniaSimple("ty", l2);
		ic=new InsigniaCompuesta("qwer", iucr,iucv);
		us=mock(UsuarioSimple.class);
	}

	@Test
	public void testSeCumple() {
		when(l.seCumple(us)).thenReturn(true);
		when(l2.seCumple(us)).thenReturn(true);
		when(us.cantDeVotos()).thenReturn(2);
		when(us.cantidadDeRespuestas()).thenReturn(2);
		Assert.assertEquals(true, ic.seCumple(us));
		when(l.seCumple(us)).thenReturn(false);
		Assert.assertEquals(false, ic.seCumple(us));
		
	}
	@Test
	public void testLogrosConseguidos()
	{
		when(l.seCumple(us)).thenReturn(true);
		when(l2.seCumple(us)).thenReturn(false);
		List<Logro> logros=new ArrayList<Logro>();
		logros.add(l);
		Assert.assertEquals(logros, ic.getLogrosConseguidosPara(us));
		verify(l,times(1)).seCumple(us);
		verify(l2,times(1)).seCumple(us);
		
	}
	@Test
	public void testLogrosRestantes()
	{
		when(l.seCumple(us)).thenReturn(true);
		when(l2.seCumple(us)).thenReturn(false);
		List<Logro> logros=new ArrayList<Logro>();
		logros.add(l2);
		Assert.assertEquals(logros, ic.getLogrosRestantePara(us));
		verify(l,times(1)).seCumple(us);
		verify(l2,times(1)).seCumple(us);
	}

}
